package com.example.a08;

import com.example.a08.sub.E;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan("com.example.a08.sub")
public class A08Application_1 {

    private static final Logger log = LoggerFactory.getLogger(A08Application_1.class);

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(A08Application_1.class);

        /*
            对于单例对象来讲，依赖注入仅发生了一次，后续再没有用到多例的 F ，因此 E 用的始终是第一次依赖注入的 F

            解决:
                1. 仍然使用 @Lazy 生成代理
                2. 代理对象虽然还是同一个，但当每次 使用代理对象的任意方法 时，由代理创建新的f对象

        */

        E e = context.getBean(E.class);
        log.debug("{}", e.getF1().getClass());
        log.debug("{}", e.getF1());
        log.debug("{}", e.getF1());
        log.debug("{}", e.getF1());

        System.out.println("<<<<<<");

        log.debug("{}", e.getF2().getClass());
        log.debug("{}", e.getF2());
        log.debug("{}", e.getF2());
        log.debug("{}", e.getF2());

        System.out.println("<<<<<<");

        log.debug("{}", e.getF3().getClass());
        log.debug("{}", e.getF3());
        log.debug("{}", e.getF3());

        System.out.println("<<<<<<");

        log.debug("{}", e.getF4().getClass());
        log.debug("{}", e.getF4());
        log.debug("{}", e.getF4());

        context.close();

        /*
            小结:
                a. 单例注入其它 scope 的四种解决方法
                b. 解决方法虽然不同, 但理念上殊途同归: 都是推迟其它 scope bean 的获取
         */
    }
}
